A significant job of a file system is to place data on a storage medium, such as a disk storage device. Where the data is written (placed on the disk), and when and how it is accessed, can have a significant effect on performance. For example, random reads of 4 KB blocks on a disk may result in a bandwidth of 512 KB/sec, whereas reading large 128 KB blocks sequentially can increase the bandwidth to 5 MB/sec, a factor of 10 greater.
This suggests that if one were to optimize for write access, a file system would write all new data in sequential order, treating the disk as a large queue. Subsequent read access, however, might suffer from a large amount of random I/O.
Conversely, a read friendly data placement might place data that is logically adjacent in a file physically adjacent on a disk regardless of the order in which the data is written so that subsequent reads of the data will be sequential; many defragmenters do this, as do file systems. This comes at the expense of write performance, as a write to a file touches other internal file system data structures (such as super blocks, modes, indirection tables), with the result that a read optimized data placement tends to randomize write access.
File systems are most often forced to choose, at design time, the I/O profile of greatest interest, which then determines a fixed data location strategy. Some file systems select for read performance, others for writes, and others still for small file (high density) vs. large file (low density) access.
The allocation constraints of traditional prior art file systems are due in large part to their ability to place only one instance of data on the disk storage. Existing file systems do not have the capability to place and manage multiple copies of data on disks, in different orders, for the benefit of different I/O profiles and use cases.